package tacos.messing.JMSMessage;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Profile;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;
import tacos.domain.Order;
import tacos.messing.OrderMessageService;

import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;

@Profile("jms-template")
@Service
public class JmsOrderMessagingService implements OrderMessageService {
    private JmsTemplate jms;
    private Destination orderQueue;

    @Autowired
    public JmsOrderMessagingService(JmsTemplate jms,Destination orderQueue) {
        this.jms = jms;
        this.orderQueue = orderQueue;
    }

//    @Override
//    public void sendOrder(Order order) {
//        /**
//         * Destination 中可以绑定更多的属性，如果不需要其他属性只需要目的地的名字，则可以使用重载方法
//         * jms.send({QueueName},session -> session.createObjectMessage(order));
//         */
//        jms.send(orderQueue,session -> session.createObjectMessage(order));
//    }

    @Override
    public void sendOrder(Order order) {
        /**
         * P180
         * convertAndSend() 将会接收一个Destination对象或String值来确定目的地，
         * 也可以忽略目的地将消息直接发送到默认目的地上。
         *
         * 不管使用哪种形式的ConvertAndSend,传递给convertAndSend()的Order都会发送之前转换成Message。
         * 在底层，这是通过MessageConverter的实现类来完成的
         */
        jms.convertAndSend(order,this::addOrderSource);
    }


    private Message addOrderSource(Message message) throws JMSException {
        /**
         * 因为可能在多个地方的convertAndSend方法中都添加请求头，所有最好使用方法引用的形式
         */
        message.setStringProperty("X_ORDER_SOURCE", "WEB");
        return message;
    }
}
